﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CROSLAND.BL.BE;
using CROSLAND.DL.DALCF;

namespace CROSLAND.BL.BC
{
    public class PedidoBC
    {
        #region Singleton
        private PedidoBC() { }
        private static PedidoBC _instance = null;
        public static PedidoBC Instance
        {
            get { return (_instance == null) ? _instance = new PedidoBC() : _instance; }
        }
        #endregion

        /// <summary>
        /// Devuelve el plan de facturación.
        /// </summary>
        public List<PlanFactBE> getPlanFact(string pNumPedido, out List<CatFactBE> pt_CatFactBE)
        {
            //List<PlanFactBE> pf = DaoFactory.PedidoDALC.getPlanFact(pNumPedido, out  pt_CatFactBE);
            List<PlanFactBE> pf = null;
            pt_CatFactBE = null;
            return pf;
        }

        /// <summary>
        /// Genera una orden de servicio dependiendo de los codigos en el arreglo
        /// </summary>
        public string generarServicio(out string pNumPedido, List<string> pLstServ, List<string> pLstVisita)
        {
            //return DaoFactory.PedidoDALC.generarServicio(out pNumPedido, pLstServ, pLstVisita);
            pNumPedido = "";
            return null;
        }

        public List<InstalaBE> listadoInstalacion(string pNumDoc)
        {

            return null; //return DaoFactory.PedidoDALC.ListadoInstalacion(pNumDoc);
        }


        public string procesarPedido(out string pNumPedido, PedidoBE pObjPedido)
        {
            return DaoFactory.PedidoDALC.procesarPedido(out pNumPedido, pObjPedido);
        }

        public PedidoBE leer(string pNumPedido, UsuarioWebBE objUsW)
        {
            PedidoBE retObj = DaoFactory.PedidoDALC.leer(pNumPedido.PadLeft(10, '0'), false);
            if (retObj != null)
            {
                //-- carga info de materiales
                foreach (DetalleBE itm in retObj.Detalle)
                { 
                    List<MaterialBE> lstM = new List<MaterialBE>();
                    MaterialBE objMat = null;
                    objMat = MaterialBC.Instance.leerMaterial(itm.CodMaterial, retObj.OrgVentas, retObj.CanalDist, objUsW.sector, objUsW.OfVentas, objUsW.Usuario, objUsW.centro, objUsW.almacen);

                    if (objMat != null)
                    {
                        if (itm.DescMaterial.Equals("")) { itm.DescMaterial = objMat.DescMaterial; }

                        itm.CodUMedida = objMat.CodUMedida;
                        itm.UMedidaRendimiendo = objMat.UMedidaRendimiendo;
                        itm.ValorRendimiento = objMat.ValorRendimiento;
                        itm.Peso = objMat.Peso;
                        itm.TipoMaterial = objMat.TipoMaterial;

                        //--- material
                        itm.Material = objMat;
                    }
                    else
                    {
                        itm.DescMaterial = "Material " + itm.CodMaterial + " no existe o ha sido marcado para borrar.";
                    }
                }
                retObj.TipoCambio = ParametroBC.Instance.getTipoCambio(retObj.Fecha);
            }
            return retObj;
        }

        public PedidoBE leer(string pNumPedido, bool pLight, UsuarioWebBE objUsW)
        {
            PedidoBE retObj = DaoFactory.PedidoDALC.leer(pNumPedido.PadLeft(10, '0'), pLight);
            if (retObj != null)
            {
                //-- carga info de materiales
                List<MaterialBE> lstM = new List<MaterialBE>();
                foreach (DetalleBE itm in retObj.Detalle)
                {
                    MaterialBE objMat = null;
                    objMat = MaterialBC.Instance.leerMaterial(itm.CodMaterial, retObj.OrgVentas, retObj.CanalDist, objUsW.sector, objUsW.OfVentas, objUsW.Usuario, objUsW.centro, objUsW.almacen);
                    
                    if (objMat != null)
                    {
                        itm.DescMaterial = objMat.DescMaterial;
                        itm.CodUMedida = objMat.CodUMedida;
                        itm.UMedidaRendimiendo = objMat.UMedidaRendimiendo;
                        itm.ValorRendimiento = objMat.ValorRendimiento;
                        itm.Peso = objMat.Peso;
                        itm.TipoMaterial = objMat.TipoMaterial;

                        //--- material
                        itm.Material = objMat;
                    }
                    else
                    {
                        itm.DescMaterial = "Material " + itm.CodMaterial + " no existe o ha sido marcado para borrar.";
                    }
                }
                retObj.TipoCambio = ParametroBC.Instance.getTipoCambio(retObj.Fecha);
            }
            return retObj;
        }

        public string modificar(out bool pOk, PedidoBE pObjPedido)
        {
            return DaoFactory.PedidoDALC.modificar(out pOk, pObjPedido);
        }

        public string reaprovisionar(out bool pOk, PedidoBE pObjPedido)
        {
            pOk = false;
            return "";// DaoFactory.PedidoDALC.reaprovisionar(out pOk, pObjPedido);
        }

        /// <summary>
        /// Ejecuta Zweb_Calcular_Precio
        /// </summary>
        /// <param name="pObjPedido"></param>
        /// <returns></returns>
        public string cargarCondiciones(ref PedidoBE pObjPedido)
        {
            string mensaje = "", retval = "";
            List<DetalleBE> lstDetalle = new List<DetalleBE>();

            foreach (DetalleBE objDetalle in pObjPedido.Detalle)
            {
                DetalleBE pObjDetalle = objDetalle;
                List<DescuentoBE> lstDescuentos = DaoFactory.PedidoDALC.calcularPrecios(pObjPedido, objDetalle, out retval);
                DescuentoBE objPrecio = null;
                foreach (DescuentoBE o in lstDescuentos)
                {
                    if (ParametroBC.Instance.esTipoX(o.Condicion, "CondPrecios"))
                    {
                        objPrecio = o; break;
                    }
                }
                objDetalle.LstCond = lstDescuentos;

                mensaje += (retval != string.Empty ? retval + "\r\n" : "");
                pObjDetalle.Precio = (objPrecio == null ? new DescuentoBE(ParametroBC.Instance.getParamValue("CondPrecio")) : objPrecio);

                lstDetalle.Add(pObjDetalle);
            }

            //actualizar lista de detalle con las condiciones cargadas...
            pObjPedido.Detalle = lstDetalle;
            return mensaje;
        }

        public StatusBE verStatus(string pNumPedido)
        {
            return DaoFactory.PedidoDALC.verStatus(pNumPedido);
        }
        public List<EntregaBE> verEntrega(string pVbeln, string pvbtyp_n)
        {
            return DaoFactory.PedidoDALC.verEntrega(pVbeln, pvbtyp_n);
        }

        public List<SeguimientoBE> buscaDocumentos(string pNumPedido)
        {
            return DaoFactory.PedidoDALC.buscaDocumentos(pNumPedido.PadLeft(10, '0'));
        }

        public List<DetalleBE> buscaTipoPosicion(string pCodTipoDoc, string pCodMaterial, string pOrgVtas,
                                                string pCanalDist, out string pTipoPos)
        {
            string pCentro = pOrgVtas == "1000" ? "9110" : "2010";
            pTipoPos = "";
            return null; //return DaoFactory.PedidoDALC.buscaTipoPosicion(pCodTipoDoc, pCodMaterial, pOrgVtas, pCanalDist, pCentro, out pTipoPos);
        }

        public List<PedidoBE> listaPedidos(string pNumDoc, string pCodUsuario, DateTime pFecInicio, DateTime pFecFin, string pOrgVtas,
                                           string pCanal, string pOficina, string pRefLegal)
        {
            return null;//return DaoFactory.PedidoDALC.listaPedidos(pNumDoc, pCodUsuario.PadLeft(8, '0'), pFecInicio, pFecFin, pOrgVtas, pCanal, pOficina, pRefLegal);
        }

        public List<PedidoBE> listaPedidos(string pNumDoc, string pCodUsuario, DateTime pFecInicio, DateTime pFecFin,
                                           string pOrgVtas, string pCanal, string pOficina, string pRefLegal,
                                           string pMatrn, string pNombCli, string pStceg, string pDescMater, string pCodCli)
        {
            return null;
            //return DaoFactory.PedidoDALC.listaPedidos(pNumDoc, pCodUsuario, pFecInicio, pFecFin,
            //                                pOrgVtas, pCanal, pOficina, pRefLegal,
            //                                pMatrn, pNombCli, pStceg, pDescMater, pCodCli);

        }
        /// Valida que la copia sea permitida
        /// </summary>
        /// <param name="pNumDoc">Número de documento Original</param>
        /// <param name="pTipoDoc">Tipo de documento a crear</param>
        /// <returns>S = si se puede  N = No se puede</returns>
        public string validaCopia(string pNumDoc, string pTipoDoc)
        {
            return null;//return DaoFactory.PedidoDALC.validaCopia(pNumDoc, pTipoDoc);

        }
        /// <summary>
        /// Devuelve lista de pedidos con detalle de cantidades pendientes de despacho.
        /// </summary>
        /// <param name="pNumPedido">número de pedido</param>
        /// <param name="pFecIni">fecha reparto: inicio</param>
        /// <param name="pFecFin">fecha reparto: fin</param>
        /// <param name="pCodAsesor">código del asesor ó * para todos</param>
        /// <param name="pOrgVentas">organización de ventas</param>
        /// <param name="pCanalDist">canal de distribución ó ventas</param>
        /// <param name="pOfVentas">oficina de ventas</param>
        /// <returns></returns>
        public List<PedidoPosBE> ListaPendDesp(string pNumPedido, DateTime pFecIni, DateTime pFecFin, string pCodAsesor,
                                               string pOrgVentas, string pCanalDist, string pOfVentas)
        {
            if (pCodAsesor == "*")
            {
                pCodAsesor = "0";
            }

            return null;//return DaoFactory.PedidoDALC.ListaPendDesp(pNumPedido, pFecIni, pFecFin, pCodAsesor, pOrgVentas, pCanalDist, pOfVentas);
        }

        //@rgutierrez 09.11.2011
        private decimal _descuentoTotal;
        public decimal DescuentoTotal
        {
            get { return _descuentoTotal; }
            set { _descuentoTotal = value; }
        }

        public decimal calculaRendimiento(decimal pCant, decimal pRend)
        {
            if (pRend != 0m)
            {
                decimal residuo = pCant % pRend, ajuste = 0m;
                if (residuo != 0) { ajuste = 1m; }
                decimal nuevaCant = (Math.Truncate(pCant / pRend) + ajuste) * pRend;
                return decimal.Round(nuevaCant, ParametroBC.Instance.getDecimales);
            }
            return decimal.Round(pCant, ParametroBC.Instance.getDecimales);
        }

        public List<PedidoCabeceraBE> listaPedidoCabeceraDetalle(string pNumDoc, string pCodUsuario,
            DateTime pFecInicio, DateTime pFecFin, string pOrgVtas, string pCanal, string pOficina,
            string pRefLegal, string pMatrn, string pNombCli, string pStceg, string pDescMater,
            string pCodCli, out List<PedidoDetalleBE> lstDetalleBE, string pTipoDocumento)
        {
            lstDetalleBE = null;
            return null;
            //return DaoFactory.PedidoDALC.listaPedidoCabeceraDetalle(pNumDoc, pCodUsuario, pFecInicio, pFecFin,
            //    pOrgVtas, pCanal, pOficina, pRefLegal, pMatrn, pNombCli, pStceg,
            //    pDescMater, pCodCli, out lstDetalleBE, pTipoDocumento);
        }

        public List<CampañaBE> listaCampañas(string pOrgVta, string pCamp, string pCanal, string pTienda, string pPobla, DateTime pFecha, string pModelo, string pColor)
        {
            return DaoFactory.PedidoDALC.listaCampañas(pOrgVta, pCamp, pCanal, pTienda, pPobla, pFecha, pModelo, pColor);
        }

        public List<PedidoBE> ListaPedidoVMS(string nroDoc, string nroLote, DateTime fechaI, DateTime fechaF, string nroPer, string orgVta, string canal, string tienda, string docRef, string nroMat, string nomCli, string nif, string codCli, string txtPos, string tipoDoc)
        {
            return DaoFactory.PedidoDALC.ListaPedidoVMS(nroDoc, nroLote, fechaI, fechaF, nroPer, orgVta, canal, tienda, docRef, nroMat, nomCli, nif, codCli, txtPos, tipoDoc);
        }

        public List<ReservaBE> listarFacturas(string pFactura, string pFolio, DateTime fechaIni, DateTime fechaFin, string pCliente,
            string pMaterial, string pLote, string pVendedor)
        {
            return null;
        }
        public List<PedidoBE> ListaFacturasVMS(string nroFac, string nroFolio, DateTime fechaI, DateTime fechaF, string codCli, string orgVta, string canal, string centro, string sector, string tienda, string codMat, string nroLote, string nroPer)
        {
            return DaoFactory.PedidoDALC.ListaFacturasVMS(nroFac, nroFolio, fechaI, fechaF, codCli, orgVta, canal, centro, sector, tienda, codMat, nroLote, nroPer);
        }

        public List<PedidoBE> ListaFacturasRep(string nroFac, string nroFolio, DateTime fechaI, DateTime fechaF, string codCli, string orgVta, string canal, string centro, string sector, string tienda, string codMat, string nroLote, string nroPer)
        {
            return DaoFactory.PedidoDALC.ListaFacturasRep(nroFac, nroFolio, fechaI, fechaF, codCli, orgVta, canal, centro, sector, tienda, codMat, nroLote, nroPer);
        }

        public List<PedidoBE> ListaPedidoRep(string nroDoc, string nroLote, DateTime fechaI, DateTime fechaF, string nroPer, string orgVta, string canal, string tienda, string docRef, string nroMat, string nomCli, string nif, string codCli, string txtPos)
        {
            return DaoFactory.PedidoDALC.ListaPedidoRep(nroDoc, nroLote, fechaI, fechaF, nroPer, orgVta, canal, tienda, docRef, nroMat, nomCli, nif, codCli, txtPos);
        }

        public List<string> RechazarPedido(DateTime fechaInicio, DateTime fechaFin, string orgVtas, string canal, string codCliente, string oficina, List<string> lstLote)
        {
            return DaoFactory.PedidoDALC.RechazarPedido(fechaInicio, fechaFin, orgVtas, canal, codCliente, oficina, lstLote);
        }
        public string InsertPago(CabPagoBE objPago, List<DetPagosBE> lstPagos, List<DetPedFacBE> lstPedFac, out string tipoMensaje)
        {
            return DaoFactory.PedidoDALC.InsertPago(objPago, lstPagos, lstPedFac, out tipoMensaje);  
        }

        public Boolean Reenumerar(int pfolio_old, int pfolio_new, string pcaja, string ptipo, string pnroPedido, out string nroPedido)
        {
            return DaoFactory.PedidoDALC.reenumerar(pfolio_old, pfolio_new, pcaja, ptipo, pnroPedido, out nroPedido);
        }

        public List<string> CrearPedVtaVMS(DateTime fecha, string moneda, string condPago, string orgVtas, string canal,
            string sector, string codCliente, string nroPed, string codDestMer, string codResPago, string motPedido,
            string funcionVE, string oficina, string vendedorSAP, string entFin, string grpVen, string flete, string recTecho,
            string seguro, string dscto, string porcentaje, List<string> lstLote, List<GenericBE> lstStatus,
            string puestoExp, string nroDocReferencia)
        {
            return DaoFactory.PedidoDALC.CrearPedVtaVMS(fecha, moneda, condPago, orgVtas, canal, sector, codCliente, nroPed, 
                codDestMer, codResPago, motPedido, funcionVE, oficina, vendedorSAP, entFin, grpVen, flete, recTecho, seguro,
                dscto, porcentaje, lstLote, lstStatus, puestoExp, nroDocReferencia);
        }

        public string crearPedidoAnticipo(out string pNumPedido, PedidoBE pObjPedido)
        {
            return DaoFactory.PedidoDALC.crearPedidoAnticipo(out pNumPedido, pObjPedido);
        }

        public List<ValidacionStock> validacionStock(string pNumPedido)
        {
            if (pNumPedido.Trim() != "")
            {
                return DaoFactory.PedidoDALC.validacionStock(pNumPedido);     
            }
            else
            {
                return new List<ValidacionStock>();
            }
        }
    }
}
